<template>
  <Dialog v-model="dialogVisible" title="中高技班级课导入" width="500">
    <!-- 文件上传区域 -->
    <el-upload
      ref="uploadRef"
      v-model:file-list="fileList"
      :auto-upload="false"
      :disabled="formLoading"
      :limit="1"
      :on-change="handleFileChange"
      :on-exceed="handleExceed"
      :on-remove="handleFileRemove"
      accept=".xlsx, .xls"
      drag
    >
      <Icon icon="ep:upload" />
      <div class="el-upload__text">将文件拖到此处，或<em>点击上传</em></div>
      <template #tip>
        <div class="el-upload__tip text-center">
          <span>仅允许导入 xls、xlsx 格式文件。</span>
          <el-link
            :underline="false"
            style="font-size: 12px; vertical-align: baseline"
            type="primary"
            @click="importTemplate"
          >
            下载模板
          </el-link>
        </div>
      </template>
    </el-upload>

    <!-- 工作表选择区域 -->
    <div v-if="sheetNames.length > 0" class="mt-4">
      <el-alert
        v-if="sheetNames.length > 1"
        title="检测到多个工作表"
        type="info"
        :description="`该Excel文件包含 ${sheetNames.length} 个工作表，请选择要导入的工作表。`"
        show-icon
        :closable="false"
        class="mb-3"
      />
      <el-alert
        v-else
        title="自动选择工作表"
        type="success"
        :description="`该Excel文件只有一个工作表：${sheetNames[0]}，将自动导入此工作表。`"
        show-icon
        :closable="false"
        class="mb-3"
      />

      <el-form-item v-if="sheetNames.length > 1" label="选择工作表：">
        <el-select v-model="selectedSheetName" placeholder="请选择要导入的工作表" style="width: 100%">
          <el-option
            v-for="sheetName in sheetNames"
            :key="sheetName"
            :label="sheetName"
            :value="sheetName"
          />
        </el-select>
      </el-form-item>
    </div>

    <!-- 导入选项 -->
    <div class="mt-4">
      <el-form-item>
        <el-checkbox v-model="updateSupport" />
        是否更新已经存在的中高技班级课数据
      </el-form-item>
    </div>

    <template #footer>
      <el-button :disabled="formLoading || !canSubmit" type="primary" @click="submitForm">确 定</el-button>
      <el-button @click="dialogVisible = false">取 消</el-button>
    </template>
  </Dialog>
</template>

<script setup lang="ts">
import { ClassMajorApi } from '@/api/ao/classmajor'
import { getAccessToken, getTenantId } from '@/utils/auth'
import download from '@/utils/download'

defineOptions({ name: 'ClassMajorImportForm' })

const message = useMessage() // 消息弹窗

const dialogVisible = ref(false) // 弹窗的是否展示
const formLoading = ref(false) // 表单的加载中
const uploadRef = ref()
const fileList = ref([]) // 文件列表
const updateSupport = ref(false) // 是否更新已经存在的中高技班级课数据
const sheetNames = ref([]) // 工作表名称列表
const selectedSheetName = ref('') // 选中的工作表名称
const currentFile = ref(null) // 当前选择的文件

/** 打开弹窗 */
const open = () => {
  dialogVisible.value = true
  resetForm()
}
defineExpose({ open }) // 提供 open 方法，用于打开弹窗

/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件，用于操作成功后的回调
const submitForm = async () => {
  if (!currentFile.value) {
    message.error('请选择要导入的文件')
    return
  }
  
  // 确定要使用的工作表名称
  const sheetName = sheetNames.value.length === 1 ? sheetNames.value[0] : selectedSheetName.value
  if (sheetNames.value.length > 1 && !sheetName) {
    message.error('请选择要导入的工作表')
    return
  }

  try {
    formLoading.value = true
    
    // 构建表单数据
    const formData = new FormData()
    formData.append('file', currentFile.value.raw)
    formData.append('updateSupport', updateSupport.value)
    if (sheetName) {
      formData.append('sheetName', sheetName)
    }

    // 发起导入请求
    const result = await ClassMajorApi.importClassMajor(formData)
    
    // 处理导入结果
    if (result.createClassMajorCount > 0 || result.updateClassMajorCount > 0) {
      let successMsg = `导入成功！`
      if (result.createClassMajorCount > 0) {
        successMsg += `新增 ${result.createClassMajorCount} 条数据。`
      }
      if (result.updateClassMajorCount > 0) {
        successMsg += `更新 ${result.updateClassMajorCount} 条数据。`
      }
      if (result.failureClassMajorCount > 0) {
        successMsg += `失败 ${result.failureClassMajorCount} 条数据。`
      }
      message.success(successMsg)
    }
    
    // 显示失败信息
    if (result.failureClassMajorCount > 0 && result.failureClassMajorMessages) {
      const failureMsg = result.failureClassMajorMessages.join('\n')
      message.error(`导入失败的数据：\n${failureMsg}`)
    }
    
    dialogVisible.value = false
    emit('success')
    
  } catch (error) {
    console.error('导入失败:', error)
    message.error('导入失败，请检查文件格式和内容')
  } finally {
    formLoading.value = false
  }
}

/** 重置表单 */
const resetForm = () => {
  fileList.value = []
  updateSupport.value = false
  sheetNames.value = []
  selectedSheetName.value = ''
  currentFile.value = null
  uploadRef.value?.clearFiles()
}

/** 文件选择改变 */
const handleFileChange = async (file) => {
  currentFile.value = file
  
  // 获取工作表名称
  try {
    const formData = new FormData()
    formData.append('file', file.raw)
    
    const sheets = await ClassMajorApi.getExcelSheets(formData)
    sheetNames.value = sheets || []
    
    // 如果只有一个工作表，自动选择
    if (sheetNames.value.length === 1) {
      selectedSheetName.value = sheetNames.value[0]
    } else {
      selectedSheetName.value = ''
    }
  } catch (error) {
    console.error('获取工作表失败:', error)
    message.error('无法读取Excel文件的工作表信息')
    sheetNames.value = []
  }
}

/** 文件超出限制 */
const handleExceed = () => {
  message.error('最多只能上传一个文件！')
}

/** 文件移除 */
const handleFileRemove = () => {
  currentFile.value = null
  sheetNames.value = []
  selectedSheetName.value = ''
}

/** 下载模板 */
const importTemplate = async () => {
  try {
    const data = await ClassMajorApi.importTemplate()
    download.excel(data, '中高技班级课导入模板.xls')
  } catch {
    message.error('下载模板失败')
  }
}

/** 是否可以提交 */
const canSubmit = computed(() => {
  if (!currentFile.value) return false
  if (sheetNames.value.length > 1 && !selectedSheetName.value) return false
  return true
})
</script>
